Создает упрощенную информацию о типе, которую может использовать реализация IDispatch.
HRESULT CreateDispTypeInfo ( INTERFACEDATA pidata, LCID kid, ITypelnfo FAR* FAR*pptinfo );
Параметры
pidata
Описание интерфейса, для которого создается
информация о типе.
lcid
Идентификатор местности для имен,
используемых в информации о типе.
pptinfo
После возврата содержит
указатель на реализацию информации о типе, которую можно использовать с
DispGetlDsOfNames и Displnvoke.
Коды возврата
Из возвращенного HRESULT получают один из следующих
кодов возврата:
| Код возврата | Значение |
| S_OK | Интерфейс поддерживается. |
| E_INVALIDARG | Либо описание интерфейса, либо LCID неверны. |
| E_OUTOFMEMORY | He хватает памяти для выполнения операции. |
Комментарии
Вы можете создать информацию о типе во время исполнения,
используя CreateDispTypelnfo и структуру INTERFACEDATA, которая
описывает предоставляемый объект.
Информация о типе, возвращаемая данной
функцией, предназначена главным образом для того, чтобы автоматизировать
реализацию IDispatch. CreateDispTypelnfo возвращает не всю
информацию о типе. Аргумент pidata — это не полное описание интерфейса.
Он не содержит информации для справочной системы, комментариев, необязательных
параметров и другой информации о типе, полезной в иных контекстах.
В связи с
этим рекомендуется использовать другой способ предоставления информации о типе
для объекта, а именно описание объекта на языке ODL и компиляцию этого
описания в библиотеку типа с помощью компилятора MIDL или утилиты
MkTypLib.
Вы можете воспользоваться информацией из библиотеки типа с
помощью функций LoadTypeLib и GetTypelnfoOfGuid вместо
CreateDispTypelnfo.
Пример
Приведенный ниже код создает информацию о типе из
INTERFACEDATA для предоставления объекта CCalc.
static METHODDATA NEARDATA rgmdataCCalc [] =
{
PROPERTY(VALUE, IMETH_ACCUM, IDMEMBER.ACCUM, VT_I4)
PROPERTY(ACCUM, IMETH_ACCUM, IDMEMBER_ACCUM, VT_I4)
PROPERTY(OPND, IMETH_OPERAND, IDMEMBER_OPERAND, VT_I4)
PROPERTY(OP, IMETH_OPERATOR, IDMEMBER_OPERATOR, VT_I2)
METHODO(EVAL, IMETH_EVAL, IDMEMBER_EVAL, VT_BOOL)
METHODO(CLEAR, IMETH_CLEAR, IDMEMBER_CLEAR, VT_EMPTY)
METHODO(DISPLAY, IMETH_DISPLAY, IDMEMBER_DISPLAY, VT_EMPTY)
METHODO(QUIT, IMETH_QUIT, IDMEMBER_QUIT, VT_EMPTY)
METHOD1(BUTTON, IMETH_BUTTON, IDMEMBER_BUTTON, VT_BOOL)
}
INTERFACEDATA NEARDATA g_idataCCalc =
{
rgmdataCCalc, DIM(rgmdataCCalc)
}
// Реализация IDispatch с помощью диспетчерских функций API.
CCalc FAR*
CCalc: :Create()
{
HRESULT hresult;
CCalc FAR* pcalc;
CArith FAR* parith;
ITypelnfo FAR* ptinfo;
IUnknown FAR* punkStdDisp;
extern INTERFACEDATA NEARDATA g_idataCCalc;
if ((pcalc = new FAR CCalc()) == NULL)
return NULL;
pcalc->AddRef();
parith = &(pcalc->m_arith);
// Построить информацию о типе для функциональности данного объекта,
// которая предоставляется для программного доступа извне.
hresult = CreateDispTypeInfo(
&g_idataCCalc, LOCALE_SYSTEM_DEFAULT, &ptinfo);
if (hresult != NOERROR)
goto LErrorO;
// Создать агрегат с экземпляром стандартной реализации IDispatch,
// инициализированной с помощью информации о типе.
hresult = CreateStdDispatch(
pcalc, // Управляющий IUnknown.
parith, // Экземпляр для распределения вызовов.
ptinfo, // Информация о типе, описывающая экземпляр.
&punkStdDisp);
ptinfo->Release();
if (hresult != NOERROR) goto LErrorO;
pcalc->m_punkStdDisp = punkStdDisp;
return pcalc;
LErrorO: ;
pcalc->Release();
return NULL;
}